import axios from "axios"
import qs from "qs"
import router from "@/router/index"
import { message } from "ant-design-vue"
import { sessionGet } from "@/utils/storage"

//基础配置
const http: any = axios.create({
  timeout: 1000 * 60, //设置1分钟超时。 单独请求 》 该处设置 》 axios默认设置的 0
})

// 只针对post系列请求的， 请求主体内容进行格式化处理；按照后台的要求处理，不设置transformRequest，会把data对象转为json字符串传递给服务器。
//axios内部会识别常用的数据格式，自动设置请求头中的 Content-Type;
http.defaults.transformRequest = (data: any): any => {
  if (data && Object.keys(data) && Object.keys(data).length > 0) return qs.stringify(data)

  return data
}

// 不写默认是application/json  |application/x-www-form-urlencoded
http.defaults.headers["Content-Type"] = "application/json;charset=utf-8"

// http状态码校验
http.defaults.validateStatus = (status: number) => {
  return status >= 200 && status < 400
}

// 请求拦截
http.interceptors.request.use((config: any) => {
  config.headers = config.headers || {}

  // token 处理
  const autoToken = sessionGet("ucUserInfo")?.token || "111"
  if (autoToken) config.headers.Authorization = `Bearer ${"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhbmRtaW4xNDciLCJ0ZW5hbnRJZCI6Ii0xIiwiZXhwIjoxNjc2MDkxMzI0LCJpYXQiOjE2NzYwMDQ5MjR9.sIBiRH3k5ASS2S-WF5LuajYLa5vuMWHVAr9RYRxruxR0ZjNXcSbBgu_nNrtPNbb7DL7t49yir0ebepoDsP5BIQ"}`

  // 刷新token
  return config
})

// 响应拦截
http.interceptors.response.use(
  (response: any) => {
    // 业务逻辑判断
    // console.log(1111, response)

    if (response.data?.state || response.data) return response.data
    else return Promise.reject(response.data)
  },
  (reason: any) => {
    const status = reason?.response?.status
    const code = reason?.code
    const errorMessage = reason?.response?.data?.message || reason?.message
    if (status) {
      switch (+status) {
        case 400:
          message.error("当前请求参数有误, 请检查~~")
          break
        case 401:
          message.error("未登录, 请先登录~~")
          router.push("/login")
          // todo ...
          break
        case 403:
          message.error("当前请求被拒绝，请检查~~")
          //todo ...
          break
        case 404:
          message.error("当前请求地址不存在, 请更正~~")
          break
        case 405:
          message.error("当前请求方式不正确, 请更正~~")
          break
        case 408:
          message.error("当前请求已超时，请稍后再试~~")
          break
        case 500:
          if (errorMessage) message.error(errorMessage)
          else message.error("服务器发生未知错误，请检查~~")

          break
        case 503:
          message.error("当前服务器超负荷，请稍后再试~~")
          break
        case 504:
          message.error("当前请求网关超时，请稍后再试~~")
          break
      }
      return Promise.reject(reason?.response)
    } else if (axios.isCancel(reason)) {
      //请求中断
      message.error("当前请求已中断")
      return Promise.reject("当前请求已中断")
    } else if (code === "ECONNABORTED") {
      // 请求超时
      message.error("当前请求已超时，请稍后再试~~")
      return Promise.reject("当前请求已超时")
    } else if (code === "ERR_NETWORK") {
      //网络错误
      message.error("网络错误，情稍后重试")
      return Promise.reject("网络错误，情稍后重试")
    } else if (code === "Network Error") {
      //服务器异常
      message.error("服务器异常，请稍后重试")
      return Promise.reject("服务器异常，请稍后重试")
    } else {
      // 断网
      message.error("当前网络繁忙，请稍后再试~~")
    }
    return Promise.reject(reason)
  },
)
export default http
